/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gcs.interfaz;

import gcs.controladores.ControladorPrincipal;
import gcs.modelo.Categoria;
import gcs.modelo.ParticipanteCampeonato;
import gcs.modelo.ParticipanteCategoria;
import gcs.persistencia.GestorCategorias;
import gcs.persistencia.GestorParticipanteCampeonato;
import gcs.persistencia.GestorParticipantesCategoria;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Rafe
 */
public class MenuPrincipal {

    private ControladorPrincipal controladorPrincipal;
    
    public MenuPrincipal() throws Exception {
        controladorPrincipal = new ControladorPrincipal();
    }
    
    public void ejecutarMenu() throws Exception{
        
        boolean salir = false;

        while (!salir) {

            mostrarCategorias();

            mostrarMenuPrincipal();
            
            int opcion = UtilidadesScanner.leerEntero();
            
            switch (opcion) {
                case 1:
                    anadirCategoria();
                    break;
                case 2:
                    int cat = elegirCategoria();
                    (new MenuCategoria(controladorPrincipal.getControladorCategoria(cat-1))).ejecutarMenu();                    
                    break;
                case 3:
                    System.out.println("opcion no implementada");
                    break;
                case 4:
                    inscribirParticipantes();
                    break;
                case 5:
                    listarParticipantes();
                    break;
                case 6:
                    System.out.println("opcion no implementada");
                    break;
                case 7:
                    inscribirParticipanteACategoria();
                    break;
                case 0:
                    salir = true;
                    break;
                default:
                    System.out.println("opcion no valida");
            }

        }
        
    }
    
    private void mostrarMenuPrincipal() {

        System.out.println("Menu principal:");
        System.out.println();
        System.out.println("\t\t1. Añadir categoria");
        System.out.println("\t\t2. Acceder a una categoria");
        System.out.println("\t\t3. Eliminar una categoria (no implementada)");
        System.out.println("\t\t4. Inscribir participantes");
        System.out.println("\t\t5. Listar participantes");
        System.out.println("\t\t6. Eliminar un participante (no implementada)");
        System.out.println("\t\t7. Inscribir un participante existente a una categoria");
        System.out.println("\t\t0. Salir");
        System.out.println();
        System.out.println("\tQue deseas hacer?");
    }
    
    private void mostrarCategorias(int numTabs) {
        int t;
        for (t = 0; t < numTabs; t++) {
            System.out.print("\t");
        }
        System.out.println("Categorías actuales:");

        Iterator<Categoria> ic = controladorPrincipal.campeonato.categorias.iterator();

        int n = 1;

        while (ic.hasNext()) {
            for (t = 0; t < numTabs; t++) {
                System.out.print("\t");
            }
            System.out.println("\t" + n + ": " + ic.next());
            n++;
        }

        System.out.println();
    }

    private void mostrarCategorias() {
        mostrarCategorias(0);
    }
    
    private void anadirCategoria() {
        System.out.println("Introduce el nombre de la categoría:");
        Categoria c = new Categoria(controladorPrincipal.campeonato);
        c.nombre = UtilidadesScanner.leerLinea();
        try {
            GestorCategorias.guardar(c);
            controladorPrincipal.campeonato.categorias.add(c);
            System.out.println();
        } catch (Exception ex) {
            System.out.println("ERROR: Se ha producido algun error al guardar la categoria");
            Logger.getLogger(MenuPrincipal.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    private int elegirCategoria() {
        System.out.println("A qué categoría deseas acceder?:");
        mostrarCategorias(1);
        return UtilidadesScanner.leerEntero();
    }
    
    
    
    private void inscribirParticipantes() throws Exception{
        boolean continuar = true;
        String opcion;

        while (continuar) {

            opcion = "";

            ParticipanteCampeonato pc = new ParticipanteCampeonato();

            System.out.println("\tAñadiendo un nuevo participante:");

            System.out.println("\t\tIntroduce el identificador (dni/pasaporte):");

            
            pc.identificador = UtilidadesScanner.leerLinea();

            System.out.println("\t\tIntroduce el nombre:");

            pc.nombre = UtilidadesScanner.leerLinea();

            System.out.println("\t\tIntroduce los apellidos:");

            pc.apellidos = UtilidadesScanner.leerLinea();

            System.out.println("\t\tIntroduce la localidad:");

            pc.localidad = UtilidadesScanner.leerLinea();

            System.out.println("\t\tIntroduce la provincia:");

            pc.provincia = UtilidadesScanner.leerLinea();

            controladorPrincipal.campeonato.participantesCampeonato.add(pc);
            GestorParticipanteCampeonato.guardar(pc);

            mostrarCategorias(3);

            System.out.println("\t\tEn que categorias se inscribe? (0 para acabar):");

            int cat = UtilidadesScanner.leerEntero();

            while (cat != 0) {
                if (cat < 0 || cat > controladorPrincipal.campeonato.categorias.size()) {
                    System.out.println("\t\t\tError! Esta categoria no existe!");
                } else {
                    ParticipanteCategoria pcat = new ParticipanteCategoria(pc, controladorPrincipal.campeonato.categorias.get(cat - 1));
                    if(controladorPrincipal.campeonato.categorias.get(cat - 1).participantesCategoria.contains(pcat)){
                        System.out.println("El participante ya está inscrito en esta categoria");
                    }else{
                        controladorPrincipal.campeonato.categorias.get(cat - 1).participantesCategoria.add(pcat);
                        GestorParticipantesCategoria.guardar(pcat);
                        System.out.println("Se ha añadido el participante con id="+pcat.pcamp.identificador+" a la categoria "+cat);
                    }
                }
                cat = UtilidadesScanner.leerEntero();
            }

            System.out.println("\t\tParticipante añadido con éxito");
            System.out.println();

            while (!opcion.equalsIgnoreCase("s") && !opcion.equalsIgnoreCase("n")) {

                System.out.println("\t\tQuieres añadir más participantes en el campeonato (s/n):");

                opcion = UtilidadesScanner.leerLinea();

            }

            if (opcion.equalsIgnoreCase("n")) {
                continuar = false;
            }

        }

    }
    
    private void listarParticipantes(){
        Iterator<ParticipanteCampeonato> ipc = controladorPrincipal.campeonato.participantesCampeonato.iterator();
        System.out.println("Listado de Participantes del Campeonato:");
        System.out.println("ID\tNombre\tApellidos\tesActivo");
        while(ipc.hasNext()){
            System.out.println(ipc.next().toString());
        }
    }
    
    public void inscribirParticipanteACategoria() throws Exception{
        System.out.println("Introduce el id del participante");
        String idParticipante = UtilidadesScanner.leerLinea();
        System.out.println("Introduce el id de la categoria");
        int idCategoria = UtilidadesScanner.leerEntero();
        inscribirParticipanteACategoria(idParticipante, idCategoria);
        
    }
    
    public void inscribirParticipanteACategoria(String idParticipante, int idCategoria) throws Exception{
        if (idCategoria < 0 || idCategoria > controladorPrincipal.campeonato.categorias.size()) {
            System.out.println("\t\t\tError! Esta categoria no existe!");
        } else {
            ParticipanteCampeonato pc = new ParticipanteCampeonato();
            pc.identificador = idParticipante;
            if (!controladorPrincipal.campeonato.participantesCampeonato.contains(pc)) {
                System.out.println("Error: El participante con id=" + pc.identificador + " no existe");
            } else {
                int indice = controladorPrincipal.campeonato.participantesCampeonato.indexOf(pc);
                pc = controladorPrincipal.campeonato.participantesCampeonato.get(indice);
                ParticipanteCategoria pcat = new ParticipanteCategoria(pc, controladorPrincipal.campeonato.categorias.get(idCategoria - 1));
                if(controladorPrincipal.campeonato.categorias.get(idCategoria - 1).participantesCategoria.contains(pcat)){
                    System.out.println("El participante ya está inscrito en esta categoria");
                }else{
                    controladorPrincipal.campeonato.categorias.get(idCategoria - 1).participantesCategoria.add(pcat);
                    GestorParticipantesCategoria.guardar(pcat);
                    System.out.println("Se ha añadido el participante con id="+pcat.pcamp.identificador+" a la categoria "+idCategoria);
                }              
            }
        }
    }
    
}
